#ifndef NETLIB_FILEUTIL_H
#define NETLIB_FILEUTIL_H

// 日志文件管理类

#include "noncopyable.h"
#include "StringPiece.h"
#include <sys/types.h>  // for off_t

namespace netlib
{

namespace FileUtil
{


class ReadSmallFile : noncopyable // 不可拷贝
{
public:
    ReadSmallFile(StringArg filename); // 打开文件获得fd

    ~ReadSmallFile(); // 关闭fd

    // 读取文件数据到string对象中
    template<typename String>
    int readToString(int maxSize,
                    String* content,
                    int64_t* fileSize,
                    int64_t* modifyTime,
                    int64_t* createTime);

    int readToBuffer(int* size); // 读取文件到缓冲区

    const char* buffer() const { return buf_; } // 返回缓冲区

    static const int kBufferSize = 64*1024; // 缓冲区大小 64K

private:
    int fd_;                    // 日志文件的句柄
    int err_;                   // 错误码
    char buf_[kBufferSize];     // 缓冲区

}; // class ReadSmallFile end


// 读取文件数据到指定的string对象
template<typename String>
int readFile(StringArg filename,
             int maxSize,
             String* content,
             int64_t* fileSize = NULL,
             int64_t* modifyTime = NULL,
             int64_t* createTime = NULL)
{
  ReadSmallFile file(filename);
  return file.readToString(maxSize, content, fileSize, modifyTime, createTime);
}


class AppendFile : noncopyable // 不可拷贝，非线程安全
{
public:
    explicit AppendFile(StringArg filename);

    ~AppendFile();

    // 向日志文件中写入数据logline，write（自己实现）函数的调用
    void append(const char* logline, size_t len);

    void flush(); // 冲洗文件流缓冲区

    off_t writtenBytes() const { return writtenBytes_; } // 返回缓冲区空闲起始处

private:

    size_t write(const char* logline, size_t len); //对系统调用fwrite_unlocked的封装

    FILE* fp_;                  // 文件指针
    char buffer_[64*1024];      // 缓冲区
    off_t writtenBytes_;        // 指向缓冲区的空闲起始处

}; // class AppendFile end

}  // namespace FileUtil

}  // namespace netlib

#endif